#include "homme.h"

Homme::Homme()
{
    FIO = "";
}
Homme::Homme(QString fio, QDate& mindata, QDate& maxdata): FIO(fio), minData(mindata), maxData(maxdata){

}

HommeWin::HommeWin(){
    homme1 = new Homme();
    homme2 = new Homme();
}
HommeWin::HommeWin(Homme* hhomme1, Homme* hhomme2){
    homme1 = hhomme1;
    homme2 = hhomme2;
}
HommeWin::~HommeWin(){
    if(homme1){
        delete homme1;
        homme1 = nullptr;
    }
    if(homme2){
        delete homme2;
        homme2 = nullptr;
    }
    for(int yy = 0; yy < _spisokKl.length(); yy++){
        if(_spisokKl.at(yy)){
            delete _spisokKl.at(yy);
            _spisokKl[yy] = nullptr;
        }
    }
    _spisokKl.clear();
}

int HommeWin::ZapolnenieNow(QDate now){
    if(_spisokKl.length() > 0){
        //std::unique_ptr<DayNow[]> rrr(new DayNow[len]);
        QList<DayNow> rrr;
        //Создать список длин до сегодняшнего дня
        for (int num = 0; num < _spisokKl.length(); num++) {
            //достать номера ближайших
            //Сделать фиктивную дату
            QDate KlNowMin = QDate(now.year(), _spisokKl[num]->minData.month(), _spisokKl[num]->minData.day());
            QDate KlNowMax = QDate(now.year(), _spisokKl[num]->maxData.month(), _spisokKl[num]->maxData.day());
            rrr.append(DayNow());
            rrr.last().min = static_cast<int>(now.daysTo(KlNowMin));
            rrr.last().max = static_cast<int>(now.daysTo(KlNowMax));

            KlNowMin = QDate(now.year() + 1, _spisokKl[num]->minData.month(), _spisokKl[num]->minData.day());
            KlNowMax = QDate(now.year() + 1, _spisokKl[num]->maxData.month(), _spisokKl[num]->maxData.day());
            rrr.last().minP = static_cast<int>(now.daysTo(KlNowMin));
            rrr.last().maxP = static_cast<int>(now.daysTo(KlNowMax));
        }
        int numID = -1;
        //работа с полученным числовым массивом
        if(rrr.length() > 0){
            QList<DayNowVsp> raznY;
            for (int num = 0; num < rrr.length(); num++) {
                raznY.append(DayNowVsp());
                raznY.last().YNow = static_cast<int>(std::min(std::fabs(rrr[num].max), std::fabs(rrr[num].min)));
                raznY.last().YNowP = static_cast<int>(std::min(std::fabs(rrr[num].maxP), std::fabs(rrr[num].minP)));
            }
            QList<int> raznD;
            if(raznY.length() > 0){
                for (int num = 0; num < raznY.length(); num++) {
                    raznD.append(static_cast<int>(std::min(std::fabs(raznY[num].YNow), std::fabs(raznY[num].YNowP))));
                }
                if(!raznD.isEmpty()){
                    //Получение номеров.Пока только трех номеров
                    int vsp = std::numeric_limits<int>::max();
                    for (int num = 0; num < raznD.length(); num++) {
                        if(vsp > raznD[num]){
                            vsp = raznD[num];
                            numID = num;
                        }
                    }
                }
            }
        }
        //Вывод на экран
        emit signalViewD(_spisokKl[numID]->FIO, _spisokKl[numID]->maxData.toString(),
                         now.year() - _spisokKl[numID]->maxData.year());
    }
    else return -1;
    return 0;
}

int HommeWin::ReadHomme(QString pathF){
    if(pathF.isNull() || pathF.isEmpty()) return -1;

    if(!QFile::exists(pathF)){
        qDebug() << "Файл не существует";
        return -1;
    }

    std::unique_ptr<QFile> fileBD(new QFile(pathF));
    if (!fileBD->open(QIODevice::ReadOnly | QIODevice::Text)){
        qDebug() << "Файл не открывается";
        return -1;
    }

    while (!fileBD->atEnd()) {
        QString line = fileBD->readLine();
        QString strokaF = QString(line.toUtf8());
        QStringList stringListN = strokaF.split("\t\t\t");
        if(stringListN.length() == 5){
            //Добавить новый класс и заполнить его
            _spisokKl.append(new Homme);
            //Удаление лишних символов
            for(int number = 0; number < 5; number++){
                stringListN[number].remove(QRegExp("[\t\n]."));
            }
            //минимальная дата
            QStringList stringListData = stringListN[0].split(".");
            if(stringListData.length() != 2){
                qDebug() << "Длина списка некорректна(2)";
                return -1;
            }
            _spisokKl.last()->minData = QDate(stringListN[2].toInt(), stringListData[1].toInt(), stringListData[0].toInt());
            stringListData.clear();
            //максимальная дата
            stringListData = stringListN[1].split(".");
            if(stringListData.length() != 2){
                qDebug() << "Длина списка некорректна(3)";
                return -1;
            }
            _spisokKl.last()->maxData = QDate(stringListN[3].toInt(), stringListData[1].toInt(), stringListData[0].toInt());

            //фио
            _spisokKl.last()->FIO = stringListN[4];

        }
        else {
            qDebug() << "Длина списка некорректна";
            return -1;
        }
    }

    fileBD->close();

    return  0;
}
